Cost and Usage Report(CUR)のマニフェストファイルを使用してAmazon Athenaのテーブルを作成する

Cost and Usage Report(CUR)のマニフェストファイルを使用してAmazon Athenaのテーブルを作成する

Cost and Usage Report(CUR)のマニフェストファイルからAmazon Athena用のDDLを作成し、テーブルを作成するスクリプトを作ってみました。
Clock Icon2019.10.21

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

実行環境が古くなっていたため、ツール等アップデートしました。またAWS CloudShellでの実行を確認しました。Date: 2024-10-21

こんにちは。サービスグループの武田です。

AWSでは、AWSサービスの利用明細などが記載されたCost and Usage Report(CUR)というレポートを取得できます。個人で利用している方、あるいはAWS Organizationsの一括請求機能を利用している方は、レポート出力の設定をすれば取得できます。

AWS のコストと使用状況レポートを作成する - AWS 請求情報とコスト管理

クラスメソッドが提供しているAWS総合支援サービスであるメンバーズでは、加入いただくことでAWS利用費が割り引きされます。しかし、このCURが利用できないということで、一部のお客様からレポート提供の要望をいただいていました。先日、CUR提供のサービスを開始しまして、簡単な設定をするだけでレポートを取得できます(詳細はお知らせなどをご覧ください)。

ここからが本題ですが、CURは列が可変のため、列情報などがマニフェストファイルとして提供されています。またレポートは 上書きではなく追加 をするため、どれが最新のレポートなのかも、マニフェストファイルを確認する必要があります。そして、CUR自体はただのCSVファイルのため(そして容量も大きいため)、やはりAthenaなどでクエリをたたきたいというのが本心です。しかし自分でマニフェストファイルを見てAthena用のDDLを作るなんてことは正直やりたくありません。

実は以前に平田が次のエントリを書いていました。

CURのマニフェストファイルからAthena向けのDDLを作成する

 

なるほど、これは便利だなということで、これを元ネタに改造したスクリプトを作ってみましたので公開します。

TAKEDA-Takashi/athena-create-table-cur: S3に保存されているCURマニフェストファイルからAthenaテーブル作成用のDDLを出力する。

環境

ざっとREADMEには書いたのですが、実行にはPython 3が必要です。またリポジトリをクローンするためGitも必要です。

$ python3 -V
Python 3.12.2

$ git --version
git version 2.44.0

次の手順で環境を構築してください(すでにuvがインストール済みであれば、3行目は不要です)。

$ git clone git@github.com:TAKEDA-Takashi/athena-create-table-cur.git
$ cd athena-create-table-cur
$ pip3 install uv
$ uv sync

使い方

10月分のレポートを例に簡単な使い方を説明します。S3のcm-cur-123456789012/CUR/Hourly/cur_hourly/20191001-20191101に、次のようにCURが出力されているとします。

このcur_hourly-Manifest.jsonを確認することで、最新のCURが格納されているassemblyIdが分かります。スクリプトでは、単にAthena用のDDLを出力するだけのprintモードと、実際にテーブルを作成するathenaモードがあります。動作確認するだけであればprintモードを使用してください。

$ uv run main.py -m s3://cm-cur-123456789012/CUR/Hourly/cur_hourly/20191001-20191101/cur_hourly-Manifest.json

次にathenaモードですが、Athenaのクエリをたたく際には結果格納用のバケットを指定する必要があります。そのため、事前に適当なバケットを作成しておいてください。ここではaws-athena-query-results-123456789012-ap-northeast-1というバケットがあるものとします。

$ uv run main.py -m s3://cm-cur-123456789012/CUR/Hourly/cur_hourly/20191001-20191101/cur_hourly-Manifest.json athena -o s3://aws-athena-query-results-123456789012-ap-northeast-1

また-f-vオプションも用意してみました。-fはすでにその月のテーブルが作成済みであった場合、先に削除してから再作成します。-vはマニフェストファイルのデータがゴミとしてAthenaクエリの結果に入ってきてしまうため、それを除外したビューを作成します。

まとめ

CURは非常に大量のレコードを含んでいるため、人間が目で確認することには向いていません。一方で、一度Athenaなどでクエリできるようにしておけば、好きなように集計できるためとても便利です。よければ使ってみてください。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.